//
// @Auther: by wujehy 
// @Email:wujehy@qq.com
// @Data:20-4-2
// @Time:上午9:49
//

#ifndef E2EEMESSAGE_OPKMANAGER_H
#define E2EEMESSAGE_OPKMANAGER_H

/**
 * @brief opk 管理器
 * 用于管理 预共享密钥 对
 */
#include <iostream>
#include <map>
#include <memory>
#include "signal_protocol.h"
#include "CommonType.h"

namespace GeeJoan
{
    namespace E2EE
    {
        namespace SDK
        {
            class OPKManager {
            private:
                // 由构造器传递
                signal_context *global_context = nullptr; // 全局变量
                // 存放 与共享密钥的集合
                // 键是 公钥 值是 密钥对
                std::map<std::string, std::unique_ptr<KeyPairDataType>> m_opk_map;
            public:

                /**
                 * @brief 固化 管理器到本地
                 * @return
                 */
                int saveOPKManager();

                /**
                 * @brief 读取 opk 管理器
                 * @return
                 */
                int loadOPKManager();

                int syncOPKManager();

                OPKManager(signal_context *globalContext);

                void setGlobalContext(signal_context *globalContext);

                /**
                 * @brief 生成 一个 opk 并 加入 缓存
                 * @return 成功 状态
                 */
                bool createOpk_One();

                /**
                 *
                 * @param size 需要生成的数量
                 * @return 成功的数量
                 */
                int createOpk_More(int size);

                std::unique_ptr<KeyPairDataType> getKeyPair(std::string pubkey);

                std::unique_ptr<KeyPairDataType> getAKeyPair();


            };
        }
    }

}

#endif //E2EEMESSAGE_OPKMANAGER_H
